/*******************************************************************************
 * * 本TS专门用于提供浏览器一侧本地化日志的实现
 ******************************************************************************/
import formmatDate from '.././DdFormmatDate/index.ts';

// indexDB的实例
let db;
let DBname = '';
let tableName = '';

/*
 db: 数据库名
 storeName： 数据表名
 indexKey：索引的key
 indexVal: 索引的value
*/

// 新增数据，最好不要用传参方式带入db，有可能会带入一个空的db    /*
// 写入的日志 的数据结构 采取json var data = { time : new Date().getTime(), msg :
//   '加入一条新的日志数据' }
//
// 调用addLog函数，插入一条数据data
// addLog(data, 1)
function addLog(logStr, cnt = 1) {
  const data = {
    time: formmatDate(new Date(), 'yyyy-MM-dd-hh:mm:ss'),
    msg: logStr
  };
  if (cnt <= 2) {
    if (db !== undefined) {
      const transaction = db.transaction(tableName, 'readwrite');
      const store = transaction.objectStore(tableName);
      const request = store.add(data);
      // tslint:disable-next-line: only-arrow-functions
      request.onsuccess = function(e) {
        // console.log('write log success，the data is' + data);
      };
      // tslint:disable-next-line: only-arrow-functions
      request.onerror = function(e) {
        // console.error('write log fail', e);
      };
    } else {
      // 由于indexedDB是异步的，第一次打开页面时db可能还没有完成初始化，因此需要做一次1秒的延迟
      // console.error('由于db还没有初始化完成，延迟1秒以后再记录日志');
      setTimeout(() => {
        addLog(data, cnt + 1);
      }, 1000);
    }
  } else {
    // 如果db还没有完成初始化，放弃记录日志
    // console.error('由于db始终没有初始化完成，无法记录日志');
  }
}

export default {
  initIndexDB(DB, table) {
    DBname = DB;
    tableName = table;
    // var objectStore
    const request = indexedDB.open(DB);
    // tslint:disable-next-line: only-arrow-functions
    request.onerror = function(event) {
      console.error('open indexedDB error');
    };
    // tslint:disable-next-line: only-arrow-functions
    request.onsuccess = function(event: Event) {
      // db = event.target.result js
      db = request.result; // ts
    };
    /* 当发现目标表logs不存在的时候创建一个目标对象（表） */

    // tslint:disable-next-line: only-arrow-functions
    request.onupgradeneeded = function(event) {
      // db = event.target.result;
      db = request.result;
      if (!db.objectStoreNames.contains(table)) {
        /*
         * 创建一个叫做 logs 的表，只能存储javascript类型的值，主键为id
         *
         */ /* 不用time作为主键是避免数据重复，毕竟到毫秒也有可能冲突 */
        /* 创建一个叫做 logs 的表，可以存储任意类型的值，自动生成主键 */

        const objectStore = db.createObjectStore(table, {
          autoIncrement: true
        });

        // 创建一个索引来通过时间time搜索，时间可能是重复的，所以不能使用 unique 索引。
        objectStore.createIndex('timeLog', 'time', {
          unique: true
        });

        // 使用事务的 oncomplete 事件确保在插入数据前对象仓库已经创建完毕
        // tslint:disable-next-line: only-arrow-functions
        objectStore.transaction.oncomplete = function(event) {
          // 将数据保存到新创建的对象仓库
          const transaction = db.transaction(table, 'readwrite');
          const store = transaction.objectStore(table);
          store.add({
            time: formmatDate(new Date(), 'yyyy-MM-dd-hh:mm:ss'),
            msg: table + ' 新建表的首次初始化数据'
          });
          // console.log('向mylogs表中增加一条数据');
        };
      } else {
        // console.log('mylogs表之前已经建立了');
      }
    };
  },
  // 取日志
  getLog(cnt = 1) {
    if (cnt <= 2) {
      if (db !== undefined) {
        const transaction = db.transaction(tableName, 'readwrite');
        const store = transaction.objectStore(tableName);
        // const request = store.get(key)
        const request = store.getAll();
        // tslint:disable-next-line: only-arrow-functions
        request.onsuccess = function(e) {
          console.log('get log success');
          // console.log(e.target.result);
        };
        // tslint:disable-next-line: only-arrow-functions
        request.onerror = function(e) {
          console.error('get log fail');
        };
      } else {
        // console.error('由于db还没有初始化完成，延迟1秒以后再读取日志')
        setTimeout(() => {
          this.getLog(cnt + 1);
        }, 1000);
      }
    } else {
      // 如果db还没有完成初始化，放弃记录日志
      // console.error('由于db始终没有初始化完成，无法读取日志')
    }
  },

  // 建议在页面离开的时候执行，避免资源占用和多个页面建立多个连接产生潜在的冲突。
  closeDb() {
    db.close();
    console.info('indexedDB关闭了');
  },

  /*
   * 写日志的函数
   */
  writeLog(loginfo: any, isShow: boolean = true) {
    const now = new Date();
    if (typeof loginfo === 'undefined') {
      loginfo = 'undefined';
    } else if (typeof loginfo === 'object') {
      loginfo = JSON.stringify(loginfo);
    }
    // tslint:disable-next-line: quotemark
    const logMsg = "【" + formmatDate(now, "yyyy-MM-dd-hh:mm:ss") + "】";
    addLog(logMsg + loginfo, 1);
    if (isShow) {
      console.log(
        '%c ddLog' + logMsg + '%c' + loginfo,
        'background: #606266; color: #fff; border-top-left-radius: 3px; border-bottom-left-radius: 3px; padding:0 5px',
        'background: #409EFF; color: #fff; border-top-right-radius: 3px; border-bottom-right-radius: 3px; padding:0 5px'
      );
    }
  }
};
